iT邦幫忙

2022 iThome 鐵人賽

DAY 13
1
Software Development

離開C#新手村的最後試煉系列 第 13

# 試煉13 - 語法糖的坑踩過了嗎

  • 分享至 

  • xImage
  •  

開始試煉

就用Demo 這篇FB 當做範例好了

程式如下

void Main()
{
    int? a = 1;
    int? b = 1;
    var c = a??0 - b??0;
    c.Dump("c");
}

先用想的
首先 a??0 是指當a是null時,就替代成0
然而 a 跟 b 都不是null 所以都不會替換
想像中
var c = 1-1;
所以c是零 對吧
實際上跑一次

居然跟我想的不一樣答案c是1
來分析看看原因
在看到
var c = a??0 - b??0;
當a是1時 ??0 - b??0; 基本上就不會執行了
所以c就會是1
程式碼就等於
var c = a;

那a是null的話呢 注意??後本來是0 我改成5 跟 30 了喔

void Main()
{
    int? a = null;
    int? b = 1;
    var c = a??5 - b??30;
    c.Dump("c");
}

先用想的
a??5 這次a是null 所以會被替換成5
問題來了 程式會執行後面的 - b??30;嗎?
如果會執行 就會變成 var c = 5-1;
不會執行 var c = 5;
實際跑看看

答案是4表示是會執行- b??30;

那a跟b是null的話呢

void Main()
{
    int? a = null;
    int? b = null;
    var c = a ?? 5 - b ?? 30;
    c.Dump("c");
}

讓你想想答案是
?
?
?
?
?

跟你想的一樣嗎 來看看C#到底是怎樣看待這段code吧
再次出現 程式是按照我寫的跑 不是按照我想的跑
(語法糖夠甜吧)

最後回到最初的題目要怎樣寫才是按照我們本來想的呢

結束試煉

程式要跑過一次看到結果跟想的一樣才是真的
請不要修改過後測都不測就上正式機阿

PS. LINQPad 6 開始才有IL+Native的功能


上一篇
# 試煉12 - 開始練習組合技2 委派 + 泛型
下一篇
# 試煉14 - 開始練習組合技3 反射 + 泛型
系列文
離開C#新手村的最後試煉30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言